iT邦幫忙

2025 iThome 鐵人賽

DAY 3
0
生成式 AI

GenAI 與人機協作下的遺留系統重構實戰|以占星軟體 Moira 為例系列 第 3

Day 03|紫炁計算引擎實作與完整星盤生成

  • 分享至 

  • xImage
  •  

本日任務聚焦於 Moira 占星系統的核心計算引擎實作,特別是中國占星學中的關鍵虛星 —— 紫炁計算系統。

紫炁作為七政四餘中的「四餘」之一,其 28 年週期的計算邏輯在 Java 版本中經過超過 50 次的迭代優化。
在缺乏完整技術文檔的情況下,我透過逆向工程還原其參數設定與數學公式,完成了End to End的紫炁計算重構。

我們整合 Swiss Ephemeris 高精度天文引擎、Django ORM 與 FastAPI 微服務,實現從輸入出生資訊到完整星盤資料 JSON 回傳的全流程實作。


🎯 今日目標

  • 實作紫炁計算引擎,確保與 Java 版本結果一致
  • 建立 Swiss Ephemeris 天文微服務架構
  • 完成七政四餘星體計算的完整 API
  • 驗證星盤生成流程的資料一致性與完整性

📊 今日進度紀錄

✅ 核心技術突破

1. 紫炁計算公式(與 Java 結果一致)

  • 週期:28 年 = 10227.1792 天
  • 基準時間:1975-03-13 16:00 GMT, 起點 230.5°
  • 運行方向:逆時針

範例驗證:

張小明(1990-05-15 14:30 台北)
→ 紫炁位置:35.43°(氐宿)

2. Swiss Ephemeris 整合

  • 計算模式:SEFLG_SWIEPH(最高精度)
  • 時間解析:0.001 秒,角度誤差小於 0.0001 度
  • 星體支援:七政 + 羅喉計都 + 月孛

3. Django + FastAPI 架構整合

Django (port 8000): API 協調 + 資料管理
FastAPI (port 8001): 天文計算引擎(高速)
PostgreSQL: 星盤與計算結果儲存
Redis: 快取與 Celery 任務佇列

🤖 Claude 協作摘要

AI 任務設定:
- 解析 Java 紫炁公式
- 還原週期計算與角度運算邏輯
- 實作 FastAPI 服務與測試
- 產出測試驗證與 RESTful API 草案

AI 輸出成果:
- 成功重建紫炁計算數學模型
- 建立 15 個 Django 模型(星體、宮位、相位)
- 實作 7 個 API 端點,支援單體/批量查詢
- 完成張小明個案的完整驗證(JSON 輸出)

📈 技術實作亮點

紫炁計算核心類別

class PurpleQiCalculator:
    def calculate_purple_qi_position(self, target_datetime, config):
        time_diff_days = (target_datetime - config.base_date).total_seconds() / 86400.0
        position_in_cycle = (time_diff_days / config.period_days) % 1.0
        degree_movement = position_in_cycle * 360.0
        current_degree = (config.base_degree - degree_movement) % 360.0
        return current_degree

微服務通信架構

class SyncCalculationServiceClient:
    def calculate_complete_chart(self, julian_day, latitude, longitude, birth_year):
        response = requests.post(
            f"{self.base_url}/complete_chart",
            json={
                "julian_day": julian_day,
                "latitude": latitude,
                "longitude": longitude,
                "birth_year": birth_year
            }
        )
        return response.json()

🔬 測試與驗證

張小明測試資料

項目 數值
出生 1990-05-15 14:30
地點 台北市(25.033°N, 121.565°E)
紫炁 35.43°(氐宿) ✅
太陽 54.18°
月亮 294.34°
上升點 181.63°
回應時間 3 秒內 ✅

Docker 健康檢查

  • Django / FastAPI / PostgreSQL / Redis / Celery → 全數健康 ✅
  • 單計算回應 < 2 秒,併發處理穩定

💡 技術創新與優化策略

  • 使用 Decimal 類型避免誤差
  • Redis 分層快取中間結果
  • Celery 任務平行處理效能計算
  • 自動 API 文檔與端點檢查機制

🎯 v0.2.0 版本里程碑達成

模組 狀態
紫炁計算系統 ✅ 100% 完成
七政四餘資料模型 ✅ 100%
API 設計與實作 ✅ 90%
完整測試流程 ✅ 通過

🧠 技術反思

成功關鍵

  1. 逆向工程策略清晰:透過參數與結果對照還原演算法
  2. 分層微服務架構:提升計算效率與解耦能力
  3. 測試驅動實作:保證程式碼可驗證與可回溯
  4. AI 協作設計輔助:加快轉譯與分類效率

解決挑戰

  • 精度差異 → 改用 Decimal、調整週期公式
  • 計算服務異常處理 → 建立 retries + logging
  • 多模組整合 → 使用明確 interface 協定同步

🚀 明日展望(Day 04)

  • 前端技術選型(React vs Vue)
  • 星盤圖形化元件與 UI 初始設計
  • 建立登入/註冊系統
  • 準備整合 Web UI 與 API 接口

📝 小結

今天是 Moira 占星系統重構中的重要部件 —— 紫炁計算邏輯完全實作,並成功搭建整體天文計算後端服務。


上一篇
Day 02|ChartData 模型轉譯與資料結構還原
下一篇
Day 04|深入分析與技術文檔建立
系列文
GenAI 與人機協作下的遺留系統重構實戰|以占星軟體 Moira 為例7
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言